#include "time.h"

//定时器数组 最多支持3个定时器
DefTimeType TimeTab[DEFTIME_SIZE];
//初始化定时器列表
/*********************************
*函数名称： DEFTIME_TimeTabInit
*函数功能： 初始化定时器列表
*输入参数： none
*输出参数： none
*********************************/
void DEFTIME_TimeTabInit(void)
{
	uint8_t* ptime	=	(uint8_t*)TimeTab;
	uint16_t sizeof_deftimestruct	=	sizeof(DefTimeType)/sizeof(uint8_t);
	for(uint8_t i = 0;i < DEFTIME_SIZE;i++)
	{
		for(uint16_t j = 0;j < sizeof_deftimestruct;j++)
			ptime[j]	=	0;
	}
}

//初始化摸个定时器
//如果返回-1 则说明没有这个定时器
//如果返回 1 则初始化完成这个定时器
/*********************************
*函数名称： DEFTIME_TimeOfNameInit
*函数功能： 初始化用户为name的定时器
*输入参数： name ：用户  
*输出参数： none
*返回值  ： -1 则说明没有该定时器 1 ：完成初始化
*********************************/
int DEFTIME_TimeOfNameInit(uint8_t name)
{
	for(uint8_t i = 0;i < DEFTIME_SIZE;i++)
	{
		if(TimeTab[i].user == name)
		{
			
			TimeTab[i].status		=	DEFTIME_NEGATIVE;
			TimeTab[i].time			=	0;
            return  1;
		}		
	}
    return  -1;
}

//定时器定时节拍
/*********************************
*函数名称： DEFTIME_BaseTime
*函数功能： 定时器一个节拍的时间
*输入参数： none
*输出参数： none
*********************************/
void DEFTIME_BaseTime(void)
{
	delay_us(DEFTIME_BASE_TIME);
}

//申请定时器
//申请成功返回1 申请失败返回-1
/*********************************
*函数名称： DEFTIME_Register
*函数功能： 向定时器列表申请定时器
*输入参数： name：定时器   time：定时器时间 
*           function：定时完成后要执行的操作
*输出参数： none
*返回值  ： 1：申请成功  -1  则说明定时器溢出
*********************************/
int DEFTIME_Register(uint8_t name,uint32_t time,uint32_t function)
{
	for(uint8_t i = 0;i < DEFTIME_SIZE;i++)
	{
		if(TimeTab[i].user == DEFTIME_NONE)
		{
			TimeTab[i].user			=	name;
			TimeTab[i].status		=	DEFTIME_NEGATIVE;
			TimeTab[i].planedtime	        =	time;
			TimeTab[i].time			=	0;
			TimeTab[i].time_goto_function	=	(void (*)(void))function;
            return  1;
		}
	}
    return  -1;
}

//注销定时器
/*********************************
*函数名称： DEFTIME_Unregister
*函数功能： 注销计数器名为name的定时器
*输入参数： name：定时器  
*输出参数： none
*********************************/
void DEFTIME_Unregister(uint8_t name)
{
	for(uint8_t i = 0;i < DEFTIME_SIZE;i++)
	{
		if(TimeTab[i].user == name)
		{
			TimeTab[i].user			=	0;
			TimeTab[i].status		=	DEFTIME_NONE;
			TimeTab[i].planedtime	=	0;
			TimeTab[i].time			=	0;
			TimeTab[i].time_goto_function	=	(void (*)(void))0;
		}
	}		
}
//定时器运行
/*********************************
*函数名称： DEFTIME_TimeRun
*函数功能： 定时器运行计数
*输入参数： none
*输出参数： none
*********************************/
void DEFTIME_TimeRun(void)
{
	DEFTIME_BaseTime();
	//轮训定时器表
	for(uint8_t i = 0;i < DEFTIME_SIZE;i++)
	{
		//检查注册的定时器
		if(TimeTab[i].user == DEFTIME_NONE)
			continue;
		//检查定时器是不是激活的 激活的定时器开始自增
		if(TimeTab[i].status == DEFTIME_NEGATIVE)
			continue;
		TimeTab[i].time++;
		//判断是不是定时时间到 比较time和plantime
		if(TimeTab[i].time < TimeTab[i].planedtime)
			continue;
		//执行定时到的函数
		TimeTab[i].status	=	DEFTIME_DING;
		//跳转
		(TimeTab[i].time_goto_function)();
		//初始化该定时器
		//DEFTIME_TimeOfNameInit(TimeTab[i].user);		
	}
}


//激活定时器
/*********************************
*函数名称： DEFTIME_ActiveTime
*函数功能： 激活定时器
*输入参数： none
*输出参数： none
*********************************/
void DEFTIME_ActiveTime(uint8_t name)
{
	//轮训表
	for(uint8_t i = 0;i < DEFTIME_SIZE;i++)
	{
		if(TimeTab[i].user == name)
			TimeTab[i].status	=	DEFTIME_ACTIVE;
	}
}

//关闭定时器
/*********************************
*函数名称： DEFTIME_NegativeTime
*函数功能： 关闭定时器
*输入参数： none
*输出参数： none
*********************************/
void DEFTIME_NegativeTime(uint8_t name)
{
	//轮训表
	for(uint8_t i = 0;i < DEFTIME_SIZE;i++)
	{
		if(TimeTab[i].user == name)
			TimeTab[i].status	=	DEFTIME_NEGATIVE;
	}
}

//获取定时器的状态
/*********************************
*函数名称： DEFTIME_GetTimeStatus
*函数功能： 获取定时器的状态
*输入参数： none
*输出参数： none
*返回值  ： 定时器状态
*********************************/
int DEFTIME_GetTimeStatus(uint8_t name)
{
	//轮训表
	for(uint8_t i = 0;i < DEFTIME_SIZE;i++)
	{
		if(TimeTab[i].user == name)
			return	TimeTab[i].status;
	}
    return  DEFTIME_ERR;
}
//定时器重载
/*********************************
*函数名称： DEFTIME_ReloadTime
*函数功能： 定时器重载
*输入参数： none
*输出参数： none
*********************************/
void DEFTIME_ReloadTime(uint8_t name)
{
	//轮训表
	for(uint8_t i = 0;i < DEFTIME_SIZE;i++)
	{
		if(TimeTab[i].user == name)
		{
			TimeTab[i].time	=	0;
			TimeTab[i].time	=	DEFTIME_ACTIVE;
		}
	}	
}
